package com.lwl.blue.seven.test7;

import com.lwl.blue.seven.constants.ContractStatus;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

/**
 * 合同状态枚举测试类
 * 用于测试ContractStatus枚举的各种方法和业务逻辑
 */
@SpringBootTest
public class ContractStatusTest {

    /**
     * 测试获取状态码方法
     * 验证每个枚举值的getCode()方法返回正确的状态码
     */
    @Test
    public void testGetCode() {
        assertEquals(Integer.valueOf(10), ContractStatus.DRAFT.getCode());
        assertEquals(Integer.valueOf(11), ContractStatus.REJECTED.getCode());
        assertEquals(Integer.valueOf(15), ContractStatus.MODIFIED.getCode());
        assertEquals(Integer.valueOf(30), ContractStatus.PENDING_AUDIT.getCode());
        assertEquals(Integer.valueOf(70), ContractStatus.EXECUTING.getCode());
        assertEquals(Integer.valueOf(80), ContractStatus.COMPLETED.getCode());
    }

    /**
     * 测试获取状态名称方法
     * 验证每个枚举值的getName()方法返回正确的状态名称
     */
    @Test
    public void testGetName() {
        assertEquals("准备", ContractStatus.DRAFT.getName());
        assertEquals("驳回", ContractStatus.REJECTED.getName());
        assertEquals("修改", ContractStatus.MODIFIED.getName());
        assertEquals("待审", ContractStatus.PENDING_AUDIT.getName());
        assertEquals("执行", ContractStatus.EXECUTING.getName());
        assertEquals("完结", ContractStatus.COMPLETED.getName());
    }

    /**
     * 测试根据状态码获取状态名称方法
     * 验证getNameByCode()方法能正确返回对应状态码的名称
     * 包括正常状态码、不存在的状态码和null值的处理
     */
    @Test
    public void testGetNameByCode() {
        assertEquals("准备", ContractStatus.getNameByCode(10));
        assertEquals("驳回", ContractStatus.getNameByCode(11));
        assertEquals("修改", ContractStatus.getNameByCode(15));
        assertEquals("待审", ContractStatus.getNameByCode(30));
        assertEquals("执行", ContractStatus.getNameByCode(70));
        assertEquals("完结", ContractStatus.getNameByCode(80));
        assertEquals("", ContractStatus.getNameByCode(99)); // 不存在的状态码
        assertEquals("", ContractStatus.getNameByCode(null)); // null值
    }

    /**
     * 测试根据状态码获取枚举方法
     * 验证getByCode()方法能正确返回对应状态码的枚举实例
     * 包括正常状态码、不存在的状态码和null值的处理
     */
    @Test
    public void testGetByCode() {
        assertEquals(ContractStatus.DRAFT, ContractStatus.getByCode(10));
        assertEquals(ContractStatus.REJECTED, ContractStatus.getByCode(11));
        assertEquals(ContractStatus.MODIFIED, ContractStatus.getByCode(15));
        assertEquals(ContractStatus.PENDING_AUDIT, ContractStatus.getByCode(30));
        assertEquals(ContractStatus.EXECUTING, ContractStatus.getByCode(70));
        assertEquals(ContractStatus.COMPLETED, ContractStatus.getByCode(80));
        assertNull(ContractStatus.getByCode(99)); // 不存在的状态码
        assertNull(ContractStatus.getByCode(null)); // null值
    }

    /**
     * 测试是否可以编辑的判断方法
     * 验证canEdit()方法对不同状态码返回正确的判断结果
     * DRAFT(10)、REJECTED(11)、MODIFIED(15)状态可以编辑
     * 其他状态不能编辑
     */
    @Test
    public void testCanEdit() {
        assertTrue(ContractStatus.canEdit(10)); // DRAFT
        assertTrue(ContractStatus.canEdit(11)); // REJECTED
        assertTrue(ContractStatus.canEdit(15)); // MODIFIED
        assertFalse(ContractStatus.canEdit(30)); // PENDING_AUDIT
        assertFalse(ContractStatus.canEdit(70)); // EXECUTING
        assertFalse(ContractStatus.canEdit(80)); // COMPLETED
    }

    /**
     * 测试是否可以删除的判断方法
     * 验证canDelete()方法对不同状态码返回正确的判断结果
     * DRAFT(10)、REJECTED(11)、MODIFIED(15)状态可以删除
     * 其他状态不能删除
     */
    @Test
    public void testCanDelete() {
        assertTrue(ContractStatus.canDelete(10)); // DRAFT
        assertTrue(ContractStatus.canDelete(11)); // REJECTED
        assertTrue(ContractStatus.canDelete(15)); // MODIFIED
        assertFalse(ContractStatus.canDelete(30)); // PENDING_AUDIT
        assertFalse(ContractStatus.canDelete(70)); // EXECUTING
        assertFalse(ContractStatus.canDelete(80)); // COMPLETED
    }

    /**
     * 测试是否可以提交审批的判断方法
     * 验证canSubmit()方法对不同状态码返回正确的判断结果
     * DRAFT(10)、REJECTED(11)、MODIFIED(15)状态可以提交审批
     * 其他状态不能提交审批
     */
    @Test
    public void testCanSubmit() {
        assertTrue(ContractStatus.canSubmit(10)); // DRAFT
        assertTrue(ContractStatus.canSubmit(11)); // REJECTED
        assertTrue(ContractStatus.canSubmit(15)); // MODIFIED
        assertFalse(ContractStatus.canSubmit(30)); // PENDING_AUDIT
        assertFalse(ContractStatus.canSubmit(70)); // EXECUTING
        assertFalse(ContractStatus.canSubmit(80)); // COMPLETED
    }

    /**
     * 测试是否可以审核的判断方法
     * 验证canAudit()方法对不同状态码返回正确的判断结果
     * 只有PENDING_AUDIT(30)状态可以审核
     * 其他状态不能审核
     */
    @Test
    public void testCanAudit() {
        assertFalse(ContractStatus.canAudit(10)); // DRAFT
        assertFalse(ContractStatus.canAudit(11)); // REJECTED
        assertFalse(ContractStatus.canAudit(15)); // MODIFIED
        assertTrue(ContractStatus.canAudit(30)); // PENDING_AUDIT
        assertFalse(ContractStatus.canAudit(70)); // EXECUTING
        assertFalse(ContractStatus.canAudit(80)); // COMPLETED
    }
}
